"""Python 文件帮助文档查看器

通过命令行显示当前目录下所有 Python 文件的帮助文档。

用法:
    python show_help.py [文件名]
    
参数:
    文件名: 可选，指定要查看的 Python 文件名，不指定则显示所有文件的帮助
"""

import os
import sys
import ast
import importlib.util
from typing import Optional

def get_module_docstring(file_path: str) -> Optional[str]:
    """获取 Python 文件的文档字符串"""
    try:
        with open(file_path, 'r', encoding='utf-8') as file:
            tree = ast.parse(file.read())
            return ast.get_docstring(tree)
    except Exception:
        return None

def show_file_help(file_path: str) -> None:
    """显示指定文件的帮助文档"""
    try:
        # 获取模块名（不含.py后缀）
        module_name = os.path.splitext(os.path.basename(file_path))[0]
        
        # 获取文档字符串
        doc = get_module_docstring(file_path)
        
        # 打印帮助信息
        print(f"\n{'='*20} {module_name} {'='*20}")
        if doc:
            print(doc)
        else:
            print(f"未找到 {module_name} 的帮助文档")
        print(f"{'='*50}\n")
    except Exception as e:
        print(f"读取 {file_path} 时出错: {e}")

def show_file_list(file_path: str) -> None:
    """显示文件的简要调用说明"""
    try:
        module_name = os.path.splitext(os.path.basename(file_path))[0]
        doc = get_module_docstring(file_path)
        if doc:
            # 提取第一行作为简要说明
            brief = doc.split('\n')[0].strip()
            # 提取用法部分
            usage = None
            for line in doc.split('\n'):
                if line.strip().startswith('python '):
                    usage = line.strip()
                    break
            
            print(f"{module_name:15} - {brief}")
            if usage:
                print(f"    用法: {usage}")
            print()
    except Exception as e:
        print(f"读取 {file_path} 时出错: {e}")

def generate_doc_file(file_path: str) -> None:
    """生成指定 Python 文件的文档"""
    try:
        module_name = os.path.splitext(os.path.basename(file_path))[0]
        doc = get_module_docstring(file_path)
        if doc:
            # 生成 markdown 文档
            doc_file_name = f"{module_name}_doc.md"
            with open(doc_file_name, 'w', encoding='utf-8') as f:
                f.write(f"# {module_name} 使用说明\n\n")
                f.write(doc)
            print(f"已生成文档：{doc_file_name}")
        else:
            print(f"未找到 {module_name} 的文档说明")
    except Exception as e:
        print(f"生成文档时出错: {e}")

def main():
    # 使用脚本所在目录作为基准目录
    current_dir = os.path.dirname(os.path.abspath(__file__))
    
    if len(sys.argv) > 1:
        if sys.argv[1] == 'list':
            # 显示所有文件的简要列表
            python_files = [f for f in os.listdir(current_dir) 
                          if f.endswith('.py') and f != 'show_help.py']
            
            if not python_files:
                print("当前目录下没有找到 Python 文件")
                return
            
            print("\n可用的 Python 脚本:\n")
            for py_file in sorted(python_files):
                show_file_list(os.path.join(current_dir, py_file))
        elif sys.argv[1] == 'gen':
            if len(sys.argv) > 2:
                # 生成指定文件的文档
                file_name = sys.argv[2]
                if not file_name.endswith('.py'):
                    file_name += '.py'
                file_path = os.path.join(current_dir, file_name)
                if os.path.exists(file_path):
                    generate_doc_file(file_path)
                else:
                    print(f"错误：找不到文件 {file_name}")
            else:
                print("请指定要生成文档的 Python 文件名")
        elif sys.argv[1] == 'show':
            if len(sys.argv) > 2:
                # 显示指定文件的文档内容
                file_name = sys.argv[2]
                if not file_name.endswith('.py'):
                    file_name += '.py'
                file_path = os.path.join(current_dir, file_name)
                if os.path.exists(file_path):
                    doc = get_module_docstring(file_path)
                    if doc:
                        print(doc)
                    else:
                        print(f"未找到 {file_name} 的文档说明")
                else:
                    print(f"错误：找不到文件 {file_name}")
            else:
                print("请指定要显示文档的 Python 文件名")
        else:
            # 如果指定了文件名，只显示该文件的帮助
            file_name = sys.argv[1]
            if not file_name.endswith('.py'):
                file_name += '.py'
            file_path = os.path.join(current_dir, file_name)
            if os.path.exists(file_path):
                show_file_help(file_path)
            else:
                print(f"错误：找不到文件 {file_name}")
    else:
        # 显示所有 Python 文件的帮助
        python_files = [f for f in os.listdir(current_dir) 
                       if f.endswith('.py') and f != 'show_help.py']
        
        if not python_files:
            print("当前目录下没有找到 Python 文件")
            return
            
        for py_file in sorted(python_files):
            show_file_help(os.path.join(current_dir, py_file))

if __name__ == "__main__":
    main()